package vip.ifmm.lehouse.common.util;

import java.security.MessageDigest;

/**
 * MD5 算法相关工具类
 *
 * @author mackyhuang
 * <p>email: mackyhuang@163.com <p>
 * <p>date: 2019/6/15 </p>
 */
public final class Md5Util {

    // 加密算法使用到的字母
    private static final char[] HEX_DIGITS = {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F'
    };

    /**
     * MD5 算法单次加密
     *
     * @param string 原文
     * @return 单次 MD5 加密后的密文
     */
    public static String MD5(String string) {

        try {
            // 获得 MD5 摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");

            // 使用指定的字节更新摘要
            mdInst.update(string.getBytes());

            // 获得密文
            byte[] md = mdInst.digest();

            // 把密文转换成十六进制的字符串形式
            final char[] result = new char[md.length * 2];
            int j = 0;
            for (byte byte0 : md) {
                result[j++] = HEX_DIGITS[byte0 >>> 4 & 0xf];
                result[j++] = HEX_DIGITS[byte0 & 0xf];
            }

            return String.valueOf(result);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 进行俩次 MD5 加密
     *
     * @param string 原文
     * @return 两次 MD5 加密后的结果
     */
    public static String DoubleMD5(String string) {
        return MD5(MD5(string));
    }
}
